#include<iostream>
#include<unistd.h>
#include<signal.h>
using namespace std;

void handler(int signo)
{
    cout << "signo is " << signo << endl;
}
void PrintPending(sigset_t &pending)
{
    for (int signo = 31; signo >= 1; signo--)
    {
        if (sigismember(&pending, signo))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }
    cout << endl << endl;
}
int main()
{
    //1.对2号信号进行自定义捕捉
    signal(2, handler);

    // 2.屏蔽 2 号信号的数据预备工作
    // 2.1-将数据设置进sigset_t信号集
    sigset_t bset, oset; // 仅在用户区---栈上开辟空间
    sigemptyset(&bset);
    sigemptyset(&oset);
    sigaddset(&bset, 2); // 并没有将“屏蔽2号信号”设置进task_struct

    //2.2-调用系统调用---将数据设置进内核
    sigprocmask(SIG_SETMASK, &bset, &oset); // 设置成功

    //3.重复打印当前进程未决信号集（pending表）：00000-00000-00000-00000-00000-00000-0
    sigset_t pending;
    int cnt = 0;
    while(true)
    {
        //3.1获取
        int n = sigpending(&pending);
        if (n < 0)
            continue;
        //3.2打印
        PrintPending(pending);
        //打印结果从右到左是1至31号信号
        sleep(1);
        cnt++;
        //3.3解除阻塞
        if (cnt == 20)
        {
            cout << "unblock 2 signal" << endl;
            sigprocmask(SIG_SETMASK, &oset, nullptr); // 设置成功
        }
    }

    //4.发送2号信号---展示

    return 0;
}